/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package gertionpersonas;

import exception.EdadIncorrectaException;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 *
 * @author UsuarioPC5
 */
public class Persona {
    //atributos
    private String nombre;
    private Date fechaNacimiento;
    private String DNI;
    private char sexo;
    private double peso;
    private double altura;
    // constantes
    private final static char SEXO_DEF='H';
    public final static int INFRAPESO=-1;
    public final static int PESO_IDEAL=0;
    public final static int SOBREPESO=1;
    private final static Date fechaDefecto = 
            (new GregorianCalendar(1980,0,1)).getTime();
    

    public Persona() {
        this("", fechaDefecto,SEXO_DEF,0,0);        
    }

    public Persona(String nombre, Date fechaNac, char sexo) {
        this(nombre,fechaNac,sexo,0,0);
    } 
    
    public Persona(String nombre, Date fechaNac, char sexo, double peso, 
            double altura) {
        this.nombre = nombre;
        this.fechaNacimiento = fechaNac;        
        this.peso = peso;
        this.altura = altura;
        comprobarSexo(sexo);
        generarDni();
    }
    
    public int calcularIMC(){
        //Calculamos el peso de la persona
        double pesoActual=peso/(Math.pow(altura, 2));
        //Segun el peso, devuelve un codigo
        if (pesoActual >= 18.5 && pesoActual < 25){
            return PESO_IDEAL;
        }else if(pesoActual<20){
            return INFRAPESO;
        }else{
            return SOBREPESO;
        }
    }
    
    public boolean mayorEdad() throws EdadIncorrectaException{
        Date hoy = new Date();
        long edad = (( hoy.getTime() - fechaNacimiento.getTime() )/(365*24*60*60))/1000;
        if (edad<0)
            throw new EdadIncorrectaException("Edad incorrecta");
        if (edad >= 18) 
            return true;
        else
            return false;
    }
    
    private void comprobarSexo(char sexo){
         if(sexo!='H' && sexo!='M'){
            this.sexo='H';
        }else{
            this.sexo=sexo;
        }
    }
 
    private void generarDni(){
        final int divisor=26;
        //Generamos un número de 8 digitos
        int numDNI = (int) (Math.random() * 100000000);
        //Calculamos la letra del DNI
        char letraDNI=(char) (numDNI % divisor + 65);
        //Pasamos el DNI a String
        DNI=Integer.toString(numDNI)+letraDNI;
    }
    
    public String toString(){
        String sexo="";
        if(this.sexo=='H'){
            sexo="hombre";
        }else{
            sexo="mujer";
        }
        return "Informacion de la persona:\n" +
                "Nombre: "+nombre+"\n" +
                "Sexo: "+sexo+"\n" +
                "Fecha de nacimietno: "+fechaNacimiento+"\n" +
                "DNI: "+DNI+"\n" +
                "Peso: "+peso+" kg\n" +
                "Altura: "+altura+" metros\n";
    }
    
    // Getters and setters
    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getDNI() {
        return DNI;
    }
    
    public char getSexo() {
        return sexo;
    }

    public void setSexo(char sexo) {
        this.sexo = sexo;
    }

    public double getPeso() {
        return peso;
    }

    public void setPeso(double peso) {
        this.peso = peso;
    }

    public double getAltura() {
        return altura;
    }

    public void setAltura(double altura) {
        this.altura = altura;
    }    

    public Date getFechaNacimiento() {
        return fechaNacimiento;
    }

    public void setFechaNacimiento(Date fechaNacimiento) {
        this.fechaNacimiento = fechaNacimiento;
    }
}
